/**
 * File: ThreadPool.h
 * Created Time: 2024-12-30
 * Author: chugehehe (3321592850@qq.com)
 */


#ifndef __THREADPOOL_H__
#define __THREADPOOL_H__

#include "ConnectionPool.h"
#include "TaskQueue.h"
#include <thread>
#include <vector>
#include <atomic>

using std::thread;
using std::vector;
using std::atomic;

class ThreadPool
{
public:
    ThreadPool(size_t threadNum, size_t queueSize, ConnectionPool* connPool);
    void start(); // 启动线程池 
    void stop(); // 停止线程池
    void addTask(Task &&taskcb); // 添加任务
    void releaseConnection(shared_ptr<MySQLConnection> &conn); // 释放连接
    shared_ptr<MySQLConnection> getConnection(); // 获取连接

private:
    Task getTask(); // 任务队列取任务
    void doTask(); // 执行任务

private:
    size_t _queueSize;        // 任务队列容量
    TaskQueue _taskQueue;     // 任务队列
    size_t _threadNum;        // 线程数量
    vector<thread> _threads;  // 线程池
    atomic<bool> _isExit;     // 是否退出

    // 连接池
    ConnectionPool* _connPool; // 连接池指针
};

#endif